// 引入流模块
const { Readable } = require('stream');

// 1. 自定义可读流类，继承Readable
class MyReadable extends Readable {
  constructor(options) {
    // 调用父类构造函数，指定编码为utf8（可选，默认buffer）
    super({ ...options, encoding: 'utf8' });
    // 初始化当前要输出的字母（a的ASCII码为97）
    this.currentCharCode = 97;
  }

  // 2. 重写_read方法（可读流的核心方法，用于生产数据）
  // 当流的缓冲区为空时，Node.js会自动调用_read方法
  _read(size) {
    // 生成当前字符（从a开始，到z结束）
    const char = String.fromCharCode(this.currentCharCode);
    
    // 3. 将数据推入流的缓冲区（push方法）
    // 若push(null)，表示流结束（EOF）
    this.push(this.currentCharCode <= 122 ? char : null);
    
    // 4. 更新下一个要输出的字符（a-z对应ASCII码97-122）
    this.currentCharCode++;
  }
}

// 3. 创建自定义可读流实例
const myReadableStream = new MyReadable();

// 4. 将自定义流通过管道写入标准输出（process.stdout是可写流）
myReadableStream.pipe(process.stdout);

// 监听流结束事件
myReadableStream.on('end', () => {
  console.log('\n自定义可读流已输出所有字符（a-z）');
});